package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ItemRepository extends ElasticsearchRepository<Item, Long> {

    Iterable<Item> queryItemsByTitleMatches(String title);

    // 多条件自定义查询
    // 多个条件之间我们要使用and或or来分隔,以表示多个条件间的逻辑运算关系
    // 下面我们使用title和brand字段进行多条件查询
    // 多个条件时,方法名会按照规则编写多个条件,参数也要根据条件的数量来变化
    // 声明参数时,要按照方法名中需要参数的次序声明对应的参数,参数对应规则和参数名称无关
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(
            String title,String brand);

    // 排序查询
    // 方法名称中添加OrderBy关键字,指定排序的字段和排序的方向
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title,String brand);


    // 分页查询
    // 参数方面:执行分页查询必须指定要查询的页码,和每页的条数
    // 这两个数据可以封装在Pageable类型的参数中,框架规定,这个参数必须放在参数列表中最后一个
    // 返回值方面:分页查询时,我们返回给前端的数据不但要包含查询到的当前页数据,还要包含分页信息
    // 分页信息指:当前页码,每页条数,总页数,总条数,有没有上一页有没有下一页...等
    // 返回值修改为Page类型,就能满足这个要求

    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);
}
